package cn.lkk.samples.apis;


import java.util.ArrayList;
import java.util.Arrays;

/**
 * java.util.ArrayList 类的使用演示。
 * 该集合类用于表示变长数组。
 */
public class ArrayListApi {

    public static void main(String[] args) {
        toArray();
    }

    /**
     * 演示创建 ArrayList 的两种语法
     */
    public static void createArrayList() {
        ArrayList<Integer> integers;

        //基本语法
        integers = new ArrayList<Integer>();

        //钻石语法，JDK7以上才支持
        integers = new ArrayList<>();

    }

    /**
     * 演示如何访问 ArrayList 中的元素
     */
    public static void accessElement() {
        ArrayList<Integer> integers = new ArrayList<>();

        //添加元素
        integers.add(1);
        integers.add(2);

        //在指定位置前面添加元素，位置从0开始
        integers.add(0, 3);

        //通过 size 函数获得数组长度
        for (int i = 0; i < integers.size(); ++i) {
            if (i != 0)
                System.out.print(",");
            //通过 get 函数获得指定指定位置的元素
            System.out.print(integers.get(i));
        }
        System.out.println();

        //替换指定位置的元素
        integers.set(2, 10);
        //移除指定位置的元素
        integers.remove(0);

        for (int i = 0; i < integers.size(); ++i) {
            if (i != 0)
                System.out.print(",");
            System.out.print(integers.get(i));
        }
    }

    /**
     * 演示将 ArrayList 转换成数组
     */
    public static void toArray() {
        ArrayList<Integer> integers = new ArrayList<>();
        for (int i = 0; i < 10; ++i) {
            integers.add(new Integer(i));
        }

        // ArrayList => 数组
        Integer[] is = new Integer[integers.size()];
        integers.toArray(is);

        System.out.println(Arrays.toString(is));
    }

    /**
     * 演示参数化 ArrayList 与原始类型的兼容问题
     */
    @SuppressWarnings("unchecked")
    public static void compatibilityTest() {
        //参数化类型可以直接赋值给原始类型
        ArrayList rawList = new ArrayList<Integer>();

        //原始类型也可以直接赋值给参数化类型，但是有警告
        ArrayList<Integer> integers = new ArrayList();
        //强制类型转换之后也会有异常
        integers = (ArrayList<Integer>) new ArrayList();
    }
}
